﻿using RabbitMQ.Client.Events;
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Consumer02.Consumers
{
    public class SmsReceive
    {
        /// <summary>
        ///  工作模式的消费者
        /// </summary>
        public static void Sender()
        {
            using (var connection = Common.RabbitUtils.GetConnention().CreateConnection())
            {

                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(Common.RabbitConstant.QUEUE_SMS, true, false, false, null);
                    // 如果不写basicQos(1),则自动MQ会将所有请求平均发送给所有消费者
                    // 如果不写basicQos，MQ不再对消费者发送多个请求，而是消费者处理完一个消息（确定后），再从队列中获取一个新的
                    channel.BasicQos(0, 1, false);

                    // 定义一个EventingBasicConsumer消费者
                    var consumer = new EventingBasicConsumer(channel);
                    // 接收到消息时触发的事件
                    consumer.Received += (model, ea) =>
                    {
                        var body = ea.Body.ToArray();
                        var message = Encoding.UTF8.GetString(body);
                        Console.WriteLine($"消费者2接受短息成功：{message}");
                        // 第一个参数： deliveryTag：这是一个与接收的消息相关的唯一标识符，用于标识当前处理的消息实例。这个标识符是由RabbitMQ分配给消息的，并且是在同一个通道(channel)中是唯一的。
                        // 第二个参数：当multiple设置为false时，表示只确认接收到的具有指定deliveryTag的单条消息
                        //             当multiple设置为true时，表示要同时确认所有未处理的消息直到包括这个deliveryTag的消息。换句话说，这将一次性确认所有比这个deliveryTag小或等于的未被确认的消息
                        channel.BasicAck(ea.DeliveryTag, false);
                    };
                    // 调用消费方法 queue指定消费的队列，autoAck指定是否自动确认，consumer就是消费者对象
                    channel.BasicConsume(Common.RabbitConstant.QUEUE_SMS, false, consumer);
                    Console.WriteLine("Press [entry] to exist");
                    Console.Read();
                }
            }
        }
    }
}
